﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.splin
    三次样条函数插值微商与积分
    参数 n: n给定结点个数。
    参数 x: x[n]存放给定n个结点值。
    参数 y: y[n]存放给定n个结点上的函数值。当flag=3时，要求y[0]=y[n-1],dy[0]=dy[n-1],ddy[0]=ddy[n-1]。
    参数 dy: dy[n]返回给定n个结点上的一阶导数值。当flag=1时，要求dy[0]与dy[n-1]给定。
    参数 ddy: ddy[n]返回给定n个结点上的二阶导数值。当flag=2时，要求ddy[0]与ddy[n-1]给定。
    参数 m: m指定插值点个数。
    参数 t: t[m]存放定m个插值点值。
    参数 z: z[m]返回指定m个插值点上的函数值。
    参数 dz: dz[m]返回指定m个插值点上的一阶导数值。
    参数 ddz: ddz[m]返回指定m个插值点上的二阶导数值。
    参数 flag: flag边界条件类型。
    返回值 函数返回积分值。
    */

    public static string drive_splin(int w, int h)
    {
        int n, m, i;
        double s;
        double[] x = new double[12] { 0.52, 8.0, 17.95, 28.65, 50.65, 104.6, 156.6, 260.7, 364.4, 468.0, 507.0, 520.0 };
        double[] y = new double[12] { 5.28794, 13.84, 20.2, 24.9, 31.1, 36.5, 36.6, 31.0, 20.9, 7.8, 1.5, 0.2 };
        double[] t = new double[8] { 4.0, 14.0, 30.0, 60.0, 130.0, 230.0, 450.0, 515.0 };
        double[] dy = new double[12];
        double[] ddy = new double[12];
        double[] z = new double[8];
        double[] dz = new double[8];
        double[] ddz = new double[8];

        dy[0] = 1.86548;
        dy[11] = -0.046115;
        n = 12;
        m = 8;
        s = gl.splin(n, x, y, dy, ddy, m, t, z, dz, ddz, 1);

        string rs = "";
        rs += gl.html_table("X", x);
        rs += gl.html_table("Y", y);
        rs += gl.html_table("dy", dy);
        rs += gl.html_table("ddy", ddy);
        rs += gl.html_table("dz", dz);
        rs += gl.html_table("ddz", ddz);

        int pk = 10;
        double[] px = new double[(x.Length - 1) * pk + 1];
        double[] py = new double[(y.Length - 1) * pk + 1];
        for (i = 0; i < x.Length - 1; i++)
        {
            for (int j = 0; j <= pk; j++)
            {
                px[i * pk + j] = x[i] + (x[i + 1] - x[i]) * ((double)j / (double)pk);
            }
        }
        gl.splin(n, x, y, dy, ddy, px.Length, px, py, dz, ddz, 1);

        rs += html_image(w, h, px, py,
            new double[] { 0.0, 100.0, 200.0, 300.0, 400.0, 500.0, 600.0 },
            new double[] { 0.0, 10.0, 20.0, 30.0, 40.0, 50.0 },
            x,
            y
        );
        return rs;
    }
}